#include "Structs.hpp"

#ifndef HUFFMANTREE_FUNCTION_HPP
#define HUFFMANTREE_FUNCTION_HPP

// 尾插法插入至权重链表
void insertHelpNode(HelpNode *list, int data);


// 从权重链表中查找最小值
int getMin(HelpNode *list);

// 生成权重链表
HelpNode *getHelpList(int arr[], int size);

// 获取权重链表的长度

// 创建父节点()
Node *mergeTree0(int left, int right);

Node *mergeTree1RightNode(int left, Node *rightNode);

Node *mergeTree1LeftNode(Node *leftNode, int right);

Node *mergeTree2(Node *leftNode, Node *rightNode);

// 生成哈夫曼树
Node *createHuffmanTree(HelpNode *helpList);

// 获取权重数组
void getNumArr(Code arr[], int numArr[], int size);

// 写入哈夫曼编码
void codeTree(Code arr[], Node *huffmanTree, int size, const string& code);

// 写入文件
void writeToFile(Code arr[], int size);

// 获取数组大小
int getHfmTreeSize();

// 读取文件
void readFromFile(Code arr[], int size);

// 字符转码
void encode(Code arr[], char character, int size);

// 码转字符
char decode(Code arr[], string decode, int size);

// 打印二叉树:   type : 0表示根节点，１表示左节点，２表示右节点. level表示层次，用于控制显示的距离
void printTree(Node *huffmanTree, int type, int level);

#endif